#ifndef MG_EEPROM_BSP_H
#define MG_EEPROM_BSP_H

#include "ite/itp.h" //for all ith driver (include GPIO) & MACRO
#include <sys/ioctl.h>
#include <unistd.h>
#include "mg_iic.h"
#include "mg_Device.h"

#define EEPROM_WP_Pin		17			//写保护IO

#define EEP_IIC_ADDR		0x50		//IIC设备地址

#define AT24C32				32*1024/8							//单位：字节
#define AT24C32_PAGE_SIZE	32									//单位：字节
#define AT24C32_PAGE_CNT	((AT24C32+1)/AT24C32_PAGE_SIZE)		//页数量

#define AT24C64				64*1024/8							//单位：字节
#define AT24C64_PAGE_SIZE	32									//单位：字节
#define AT24C64_PAGE_CNT	((AT24C64+1)/AT24C64_PAGE_SIZE)		//页数量

#define AT24C128			128*1024/8							//单位：字节
#define AT24C128_PAGE_SIZE	64									//单位：字节
#define AT24C128_PAGE_CNT	((AT24C128+1)/AT24C128_PAGE_SIZE)	//页数量

#define AT24C256			256*1024/8 							//单位：字节
#define AT24C256_PAGE_SIZE	64									//单位：字节
#define AT24C256_PAGE_CNT	((AT24C256+1)/AT24C256_PAGE_SIZE)	//页数量

#define AT24C512			512*1024/8							//单位：字节
#define AT24C512_PAGE_SIZE	128									//单位：字节
#define AT24C512_PAGE_CNT	((AT24C512+1)/AT24C512_PAGE_SIZE)	//页数量

#define AT24C1024			1024*1024/8							//单位：字节
#define AT24C1024_PAGE_SIZE	256									//单位：字节
#define AT24C1024_PAGE_CNT	((AT24C1024+1)/AT24C1024_PAGE_SIZE)	//页数量

#define P24CM01				1024*1024/8							//单位：字节
#define P24CM01_PAGE_SIZE	256									//单位：字节
#define P24CM01_PAGE_CNT	(P24CM01/P24CM01_PAGE_SIZE)			//页数量

#define EE_TYPE 			P24CM01 
#define EE_PAGE_SIZE		P24CM01_PAGE_SIZE
#define EE_PAGE_CNT			P24CM01_PAGE_CNT


//---------------------------------------------------------------
// 函数名称: BSP_EEP_ReadOneByte
// 功能描述: 读一个字节
// 输入参数: 地址
// 返回参数: 读到的字节
//---------------------------------------------------------------
uint8_t BSP_EEP_ReadOneByte(uint32_t ReadAddr);
//---------------------------------------------------------------
// 函数名称: BSP_EEP_WriteOneByte
// 功能描述: 写一个字节
// 输入参数: 地址，数据
// 返回参数: 无
//---------------------------------------------------------------
void BSP_EEP_WriteOneByte(uint32_t WriteAddr, uint8_t DataToWrite);
//---------------------------------------------------------------
// 函数名称: BSP_EEP_ReadMoreBytes
// 功能描述: 在BSP_EEP指定地址连续读取一定字节的数据（这个读是随机的）
// 输入参数: 开始读数的地址,存放数据的指针，要读取的个数
// 返回参数: 无
//---------------------------------------------------------------
void BSP_EEP_ReadMoreBytes(uint32_t ReadAddr, uint8_t *pBuffer, uint32_t NumToRead);
//---------------------------------------------------------------
// 函数名称: BSP_EEP_SequentialWrite
// 功能描述: 在BSP_EEP指定地址连续写入一定字节的数据（不能超过一页）
// 输入参数: 开始地址，要写数据指针，要写数据个数(长度不超过256)
// 返回参数: 无
//---------------------------------------------------------------
void BSP_EEP_SequentialWrite(uint32_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite);
//---------------------------------------------------------------
// 函数名称: BSP_EEP_WriteMoreBytes
// 功能描述: 随机写连续字节（程序会自动换页）
// 输入参数: 开始地址，要写数据指针，要写数据个数
// 返回参数: 无
//---------------------------------------------------------------
void BSP_EEP_WriteMoreBytes(uint32_t WriteAddr, uint8_t *pBuffer, uint32_t NumToWrite);
//--------------------------------------------------------------
// 函数名称: BSP_EEPROM_Save
// 功能描述: 保存数据至EEPROM
// 输入参数: Data:数据指针 DataLen:数据长度 EEaddr:EEPROM起始地址
// 返回参数: true
//---------------------------------------------------------------
uint8_t BSP_EEPROM_Save(uint32_t EEaddr, uint8_t* Data, uint32_t DataLen);
//--------------------------------------------------------------
// 函数名称: BSP_EEPROM_Load
// 功能描述: 从EEPROM读取数据
// 输入参数: Data:数据指针 DataLen:数据长度 EEaddr:EEPROM起始地址
// 返回参数: true
//---------------------------------------------------------------
uint8_t BSP_EEPROM_Load(uint32_t EEaddr, uint8_t* Data, uint32_t DataLen);
//初始化EEPROM引脚
void Eeprom_GPIO_Init(void);
#endif